home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / g_quake / kuaqe2.zip / CHAIN.QC < prev    next >
Text File  |  1996-10-06  |  7KB  |  241 lines

  1.  
  2. /************\
  3. * BreakChain *
  4. \************/
  5.  
  6. void (entity Head) BreakChain =
  7. {
  8.         local entity link;
  9.  
  10.         link = Head.goalentity;
  11.         while (link != world)
  12.         {
  13.                 Head = link.goalentity;
  14.                 remove (link);
  15.                 link = Head;
  16.         }
  17. };
  18.  
  19. /*********\
  20. * LinkPos *
  21. \*********/
  22.  
  23. void () LinkPos =
  24. {
  25.         makevectors (self.enemy.angles);
  26.         setorigin (self, self.owner.origin + ( ( ( self.enemy.origin + 
  27.                 (v_up * 16 * (!self.enemy.button2)) + (v_forward * 16) ) - self.owner.origin ) *
  28.                 ( self.weapon ) ) );
  29.         self.nextthink = time + 0.01;
  30. };
  31.  
  32. /***********\
  33. * MakeChain *
  34. \***********/
  35.  
  36. entity (entity head, entity tail, float num) MakeChain =
  37. {
  38.         local entity link, prevlink;
  39.         local float linknum;
  40.  
  41.         linknum = num;
  42.         num = num + 1;
  43.         prevlink = world;
  44.         while (linknum > 0)
  45.         {
  46.                 link = spawn();
  47.  
  48.                 link.goalentity = prevlink;
  49.                 prevlink = link;
  50.  
  51.                 link.owner = head;
  52.                 link.enemy = tail;
  53.                 link.weapon = linknum / num;
  54.                 link.movetype = MOVETYPE_NOCLIP;
  55.                 link.solid = SOLID_NOT;
  56.                 link.angles_z = 51 * linknum;
  57.                 link.angles_y = 41 * linknum;
  58.                 link.angles_x = 31 * linknum;
  59.                 link.avelocity = '310 410 510';
  60.                 setmodel (link, "progs/bit.mdl");
  61.                 setsize (link, '0 0 0', '0 0 0');
  62.                 makevectors (tail.angles);
  63.                 setorigin (link, head.origin + ( ( ( tail.origin 
  64.                         + (v_up * 16 * (!tail.button2)) + ( v_forward * 16 ) ) - head.origin )
  65.                         * ( link.weapon ) ) );
  66.                 link.nextthink = time + 0.01;
  67.                 link.think = LinkPos;
  68.                 linknum = linknum - 1;
  69.         }
  70.         return link;
  71. };
  72.  
  73.  
  74. /************\
  75. * HookVanish *
  76. \************/
  77.  
  78. void () HookVanish =
  79. {
  80.         self.owner.hook_out = FALSE;
  81.         if (self.enemy.classname == "player")
  82.                 self.enemy.attack_finished = time + 0.1;
  83.         BreakChain (self);
  84.         remove (self);
  85. };
  86.  
  87. /**********\
  88. * HookPull *
  89. \**********/
  90.  
  91. void () HookPull =
  92. {
  93.         local vector vel, spray;
  94.         local float v;
  95.  
  96.         if ((!self.owner.button0 && (self.owner.weapon == IT_MORNINGSTAR)) ||
  97.                 (self.owner.teleport_time > time ) || self.owner.deadflag )
  98.         {
  99.                 if (self.enemy.takedamage && (self.weapon > 0))
  100.                 {       self.enemy.nextthink = time + 0.1; }
  101.                 HookVanish();
  102.                 return;
  103.         }
  104.         else
  105.         {
  106.                 if (self.enemy.takedamage)
  107.                 {
  108.                         sound (self, CHAN_WEAPON, "blob/land1.wav", 1, ATTN_NORM);
  109.                         T_Damage (self.enemy, self, self.owner, 1);
  110.                         makevectors (self.v_angle);
  111.                         spray_x = 100 * crandom();
  112.                         spray_y = 100 * crandom();
  113.                         spray_z = 100 * crandom() + 50;
  114.                         SpawnBlood (self.origin, spray, 20);
  115.                         if (self.weapon > 0)
  116.                         {
  117.                                 self.enemy.nextthink = time + 9999999;
  118.                                 if (self.enemy.classname == "player")
  119.                                         self.enemy.attack_finished = time + 9999999;
  120.                         }
  121.                         if (self.enemy.health <= 0)
  122.                         {
  123.                                 if (self.weapon > 0)
  124.                                         self.enemy.nextthink = time + 0.1;
  125.                         }
  126.                         if (self.enemy.solid == SOLID_SLIDEBOX)
  127.                         {
  128.                                 self.velocity = '0 0 0';
  129.                                 setorigin (self, self.enemy.origin +
  130.                                         self.enemy.mins +
  131.                                         (self.enemy.size * 0.5));
  132.                         }
  133.                         else
  134.                         {
  135.                                 self.velocity = self.enemy.velocity;
  136.                         }
  137.                 }
  138.                 else
  139.                 {
  140.                         self.velocity = self.enemy.velocity;
  141.                 }
  142.                 if (self.enemy.solid == SOLID_NOT)
  143.                 {
  144.                         HookVanish();
  145.                         return;
  146.                 }
  147.                 makevectors (self.owner.angles);
  148.                 vel = self.origin - ( self.owner.origin + (v_up * 16 *
  149.                         (!self.owner.button2)) + (v_forward * 16));
  150.                 v = vlen (vel);
  151.                 if (v <= 100)
  152.                         vel = normalize(vel) * v * 10;  
  153.                 if ( v > 100 )
  154.                         vel = normalize(vel) * 1000;  
  155.                 self.owner.velocity = vel;
  156.                 self.nextthink = time + 0.1;
  157.         }
  158. };
  159.  
  160. /**************\
  161. * T_ChainTouch *
  162. \**************/
  163.  
  164. void() T_ChainTouch =
  165. {
  166.         if (other == self.owner)
  167.                 return;         // don't attach to owner
  168.  
  169.         if (other.takedamage)
  170.     {
  171.                 T_Damage (other, self, self.owner, 1 );
  172.                 SpawnBlood (self.origin, self.velocity, 1);
  173.                 HookVanish ();
  174.         }
  175.         else
  176.         {
  177.                 self.avelocity = '0 0 0';
  178.         }
  179.                 
  180.       sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
  181.  
  182.         if (!self.owner.button0)
  183.         {
  184.                 HookVanish();
  185.                 return;
  186.         }
  187.         else
  188.         {
  189.                 if (other.solid == SOLID_SLIDEBOX)
  190.                 {
  191.                         setorigin (self, other.origin + other.mins +
  192.                                 (other.size * 0.5));
  193.                         self.velocity = '0 0 0';
  194.                 }
  195.                 else
  196.                 {
  197.                         self.velocity = other.velocity;
  198.                 }
  199.                 self.weapon = other.nextthink - time;
  200.                 self.enemy = other;
  201.                 self.nextthink = time + 0.1;
  202.                 self.think = HookPull;
  203.                 self.touch = SUB_Null;
  204.         }
  205. };
  206.  
  207. /*************\
  208. * W_FireChain *
  209. \*************/
  210.  
  211. void() W_FireChain =
  212. {
  213.         local entity hook;
  214.  
  215.         self.hook_out = TRUE;
  216.         hook = spawn ();
  217.         hook.owner = self;
  218.         hook.movetype = MOVETYPE_FLY;
  219.         hook.solid = SOLID_BBOX;
  220.         
  221. // set hook speed 
  222.  
  223.         makevectors (self.v_angle);
  224.         hook.velocity = aim(self, 1000);
  225.         hook.velocity = hook.velocity * 1000;
  226.         hook.angles = vectoangles(hook.velocity);
  227.         hook.avelocity = '0 0 -500';
  228.     
  229.         hook.touch = T_ChainTouch;
  230.     
  231. // set hook sound
  232.         hook.nextthink = time + 5;
  233.         hook.think = HookVanish;
  234.  
  235.         setmodel (hook, "progs/star.mdl");
  236.         setsize (hook, '0 0 0', '0 0 0');     
  237.         setorigin (hook, self.origin + (v_forward*16) + '0 0 16' );
  238.  
  239.         hook.goalentity = MakeChain (hook, self, 8);
  240. };
  241.